      SUBROUTINE FMAT(G,H,GF,HF,X,Y,XM,YM,FI,DFI,B,alfa,KODE,INC,NG,
     &                nfix,NN,N_eq,iaval)
C
C     Calculo das sub-matrizes G e H e formacao do 
C     sistema de equacoes Ax=b
C
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)

      INCLUDE 'param_dim.inc'
      INTEGER       FDAT,FDCC,FDEX,FRES,FROT
      COMMON /narq/ FDAT,FDCC,FDEX,FRES,FROT

      COMMON /incdata/ C0,CINC,NNINC,NUMPI,NUMPCI,NINCL,VARIA


      DIMENSION NNINC(ninc_max),CINC(ninc_max)
	integer NUMPI(ninc_max),NUMPCI(ninc_max)
      integer VARIA(ninc_max)
      DIMENSION PGLIM(nparg_max,3)

      DIMENSION GF(NFIX,NFIX),HF(NFIX,NFIX)
      DIMENSION G(N_eq,N_eq),H(N_eq,N_eq)
      DIMENSION X(NX),Y(NX),XM(NX),YM(NX),FI(NX),DFI(NX)
      DIMENSION INC(NX,2),KODE(NX)


C Numero total de elementos
      NE= NN
C Numero do n� movel inicial
      NINI= NFIX+1
         
C     Calculo da Coordenada dos Pontos de Colocacao
C     (Pontos medios dos elementos.)
C
      IF(IAVAL.EQ.1) THEN
         DO  I= 1,NE
            XM(I)=0.5*( X(INC(I,1)) + X(INC(I,2)) )
            YM(I)=0.5*( Y(INC(I,1)) + Y(INC(I,2)) )
         END DO
      ELSE
         DO  I= NINI,NE
            XM(I)=0.5*( X(INC(I,1)) + X(INC(I,2)) )
            YM(I)=0.5*( Y(INC(I,1)) + Y(INC(I,2)) )
         END DO
      ENDIF        

C     Zera as matrizes em funcao da variacao do numero de equacoes 
C     e do solver direto(fill-in)
      do i=1,N_eq
         dfi(i)= 0.d0
         do j=1,N_eq
            h(i,j)=  0.d0
            g(i,j)=  0.d0
         enddo
      enddo

C     
C CALCULO DAS MATRIZES G E H
C

C     Flag para indicar que nao se trata de calculo de valores em pontos internos.
      IPTI=0

      IF (IAVAL.EQ.1) THEN

C     Loop sobre os pontos de colocacao
         DO  I=1,NFIX
            DFI(I)=0.
C     Loop sobre os elementos
            DO J=1,NFIX
               NI= INC(J,1)
               NF= INC(J,2)
               IF(I.EQ.J) THEN
                  CALL INLO(X(NI),Y(NI),X(NF),Y(NF),G(I,J),H(I,J),
     &                      BJ,alfa)
               ELSE
                  CALL INTE(XM(I),YM(I),X(NI),Y(NI),X(NF),Y(NF),H(I,J),
     &                 dh1,dh2,G(I,J),dg1,dg2,B,BJ,db1,db2,alfa,IPTI,NG)
               END IF
               DFI(I)= DFI(I) - BJ
            ENDDO
         ENDDO

C     Armazena a parte fixa das matrizes
         do i=1,nfix
            do j=1,nfix
               gf(i,j)= g(i,j)
               hf(i,j)= h(i,j)
            enddo
         enddo

      ELSE

C     COPIA AS PARTES FIXAS DAS MATRIZES 
C   *******  Dispens�vel no caso de solu��o iterativa *****
         do i=1,nfix
            do j=1,nfix
               g(i,j)= gf(i,j)
               h(i,j)= hf(i,j)
            enddo
         enddo
         
      ENDIF


C     Loop sobre os pontos de colocacao FIXOS
      DO  I=1,NFIX
C     Loop sobre os elementos M�VEIS
         DO J=NINI,NN
            NI= INC(J,1)
            NF= INC(J,2)
            IF(I.EQ.J) THEN
               CALL INLO(X(NI),Y(NI),X(NF),Y(NF),G(I,J),H(I,J),BJ,alfa)
            ELSE
               CALL INTE(XM(I),YM(I),X(NI),Y(NI),X(NF),Y(NF),H(I,J),
     &              dh1,dh2,G(I,J),dg1,dg2,B,BJ,db1,db2,alfa,IPTI,NG)
            END IF
            DFI(I)= DFI(I) - BJ
         ENDDO
      ENDDO




C     Loop sobre os pontos de colocacao MOVEIS
      
      DO  I=NINI,NN
C     Loop sobre os elementos FIXOS E MOVEIS
         DO J=1,NN
            NI= INC(J,1)
            NF= INC(J,2)
            IF(I.EQ.J) THEN
               CALL INLO(X(NI),Y(NI),X(NF),Y(NF),G(I,J),H(I,J),BJ,alfa)
            ELSE
               CALL INTE(XM(I),YM(I),X(NI),Y(NI),X(NF),Y(NF),H(I,J),
     &              dh1,dh2,G(I,J),dg1,dg2,B,BJ,db1,db2,alfa,IPTI,NG)
            END IF
            DFI(I)= DFI(I) - BJ
         ENDDO
      ENDDO

      
      
      
c     Introdu��o das condi��es de compatibilidade nas inclusoes

C     Inicializa numero de nos acumulado.
      nna = NN
      nna0= NFIX
      
      do iinc= 1,nincl
         
C     Numero de nos (elementos) da inclusao
         nni= nninc(iinc)
         
C Introduz a parte de G referente a interface

         do j=1,nni
            
C           Linhas at� NN
            do i = 1,NN
               h(i,nna+j)= -g(i,nna0+j)
            end do

C           Linhas entre NN+1 e N_Eq

            do i = 1,nni
c              linhas de G afetadas da rela��o entre condutividades

               h(nna+i,nna+j)= c0*g(nna0+i,nna0+j)/cinc(iinc)

c              Poderia ser obtido, alternativamente, a partir dos 
c              coeficientes de G j� introduzidos em H como:

c              h(nna+i,nna+j)= -c0*h(nna0+i,nna+j)/cinc(iinc)


C              Para o elemento constante:linhas de H com sinal invertido, 
C              a menos da diagonal

               if (i.eq.j) then
                  h(nna+i,nna0+j)=  h(nna0+i,nna0+j)
               else
                  h(nna+i,nna0+j)= -h(nna0+i,nna0+j)               
               endif
               
            end do
         end do


C Numero de nos acumulado ate a inclusao anterior

         nna = nna  + nni
         nna0= nna0 + nni

      enddo

C
C Inicio da INTRODUCAO DAS CC: troca das colunas (e sinais) 
C                              se u for prescrito (KODE=0).
C
      DO J=1,NFIX
         IF(KODE(J).EQ.0)THEN
            DO I=1,NN
               CH=G(I,J)
               G(I,J)=-H(I,J)
               H(I,J)=-CH
            ENDDO
         END IF
      ENDDO

C
C     DFI originalmente contem os valores do termo forcado
C     Depois  da solucao contera os valores das incognitas no contorno.
C
      DO  I=1,NN
         DO  J=1,NFIX
            DFI(I)=DFI(I)+G(I,J)*FI(J)
         ENDDO
      ENDDO


!       r=0.
!       do i=1,N_eq
!         do j=1,N_eq
!             r = r + H(i,j)**2
!         enddo
!       enddo
! 
!         write(*,*)'Apos montagem |H| = ',r
! 
! 	write(*,*)'N_Eq',N_eq
! 	open(2,file='axb.m')
! 	write(2,*)' A = ['
! 	do i=1,N_eq
! 		write(2,11)(H(i,j),j=1,N_eq),'; '
! 	enddo
! 	write(2,*)' ]'
! 
! 	write(2,*)' y = ['
! 	do i=1,N_eq
! 		write(2,11)DFI(i)
! 	enddo
! 	write(2,*)' ]'
! 
! 	close(2)
!  11     format(520f24.12,a1)

      RETURN
      END
